/*
 * Copyright 2023-2024, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Haiku Development Team
 */
#ifndef _KERNEL_ARCH_LOONGARCH64_ARCH_INT_PRIVATE_H_
#define _KERNEL_ARCH_LOONGARCH64_ARCH_INT_PRIVATE_H_

#include <SupportDefs.h>

// 定义LoongArch64架构的中断数量
#define NUM_IO_INTERRUPTS 256

// 中断帧结构，用于保存中断发生时的CPU状态
struct iframe
{
    // 通用寄存器
    uint64 zero; // $r0 - 始终为0
    uint64 ra;   // $r1 - 返回地址
    uint64 tp;   // $r2 - 线程指针
    uint64 sp;   // $r3 - 栈指针
    uint64 a0;   // $r4 - 参数/返回值
    uint64 a1;   // $r5 - 参数
    uint64 a2;   // $r6 - 参数
    uint64 a3;   // $r7 - 参数
    uint64 a4;   // $r8 - 参数
    uint64 a5;   // $r9 - 参数
    uint64 a6;   // $r10 - 参数
    uint64 a7;   // $r11 - 参数
    uint64 t0;   // $r12 - 临时寄存器
    uint64 t1;   // $r13 - 临时寄存器
    uint64 t2;   // $r14 - 临时寄存器
    uint64 t3;   // $r15 - 临时寄存器
    uint64 t4;   // $r16 - 临时寄存器
    uint64 t5;   // $r17 - 临时寄存器
    uint64 t6;   // $r18 - 临时寄存器
    uint64 t7;   // $r19 - 临时寄存器
    uint64 t8;   // $r20 - 临时寄存器
    uint64 x;    // $r21 - 保留
    uint64 fp;   // $r22 - 帧指针
    uint64 s0;   // $r23 - 保存寄存器
    uint64 s1;   // $r24 - 保存寄存器
    uint64 s2;   // $r25 - 保存寄存器
    uint64 s3;   // $r26 - 保存寄存器
    uint64 s4;   // $r27 - 保存寄存器
    uint64 s5;   // $r28 - 保存寄存器
    uint64 s6;   // $r29 - 保存寄存器
    uint64 s7;   // $r30 - 保存寄存器
    uint64 s8;   // $r31 - 保存寄存器

    // 特殊寄存器
    uint64 era;   // 异常返回地址
    uint64 badv;  // 异常访问地址
    uint64 crmd;  // 当前模式信息
    uint64 prmd;  // 上一次模式信息
    uint64 euen;  // 扩展单元使能
    uint64 ecfg;  // 异常配置
    uint64 estat; // 异常状态
};

// 中断处理函数原型
extern "C" void loongarch64_exception_entry(iframe *frame);

#endif /* _KERNEL_ARCH_LOONGARCH64_ARCH_INT_PRIVATE_H_ */